package main
import (
	"fmt"
	"reflect"
)
//5）通过反射来修改变量，注意当使用SetXxx方法来设置，需要通过对应的指针类型来完成，这样才能改变传入的变量的值，同时需要使用到 reflect.Value.Elem()方法
//通过反射修改 num int的值 以及 student的值
func reflec01(b interface{}){
	//1.获取对应的reflect.Value
	rVal := reflect.ValueOf(b)
	fmt.Printf("rValue=%v, this kind is :%v\n",rVal,rVal.Kind())	 //rValue=0xc000012090, this kind is :ptr
	//rVal.SetInt(20)  //会报错，因为SetInt（）方法是与值类型绑定，而不是指针，所以需要把 rVal指针转换成非地址的值类型可通过方法Elem()！
	//rVal.Elem()方法可以将指针类型的Value转换成对应值类型的Value   官方来说：返回rVal持有的指针指向的值的Value封装=>*num
	rVal.Elem().SetInt(20)
}
func main (){
	var num int = 10
	reflec01(&num)  //传地址
	fmt.Println("num : ",num)


	var num2 float64 = 1.2
	reflectfloat(num2)
}


func reflectfloat(b interface{}){
	rTpy := reflect.TypeOf(b)
	rVal := reflect.ValueOf(b)
	kind := rVal.Kind()
	num := rVal.Float()
	iV := rVal.Interface()
	num2 := iV.(float64)
	fmt.Printf("rTpy:%v---rVal:%v---kind:%v---num:%v---iV's type:%T---iV's value:%v---num2:%v",rTpy,rVal,kind,num,iV,iV,num2)
}
